package com.ktjy.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @author 黄军艳
 * @version 1.0
 * @date 2024/12/5  11:42
 */
@Component("transactionAspect")
@Aspect
public class TransactionAspect {
    private static final Logger log= LoggerFactory.getLogger(TransactionAspect.class);

    @Pointcut("execution( * save(com.ktjy.entity.Pet))")
    public void pt(){}
    //通过方法名进行引用，注意写法类似于调用方法需加小括号
//    @Before(value="execution(* service..*.*(..))")
    @Before(value = "pt()")
    public void before(JoinPoint jp) {
        log.info("【TransactionAspect 前置增强】模拟打开数据库连接并开启事务...");
        log.info("SqlSession sqlSession=MyBatiUtil.createSqlSession(false);");
    }
    /**
     * 后置增强-执行事务提交
     */
//    @AfterReturning(value = "execution(* service..*.*(..))",returning = "result")
    @AfterReturning(value = "pt()",returning = "result")
    public void afterReturning(JoinPoint jp,Object result) {
        log.info("【TransactionAspect 后置增强】模拟正常完成业务提交事务...");
        log.info("session.commit();");
    }
    /**
     * 异常抛出增强-执行事务回滚
     */
//    @AfterThrowing(value = "execution(* service..*.*(..))",throwing = "e")
    @AfterThrowing(value = "pt()",throwing = "e")
    public void afterThrowing(JoinPoint jp,Throwable e) {
        log.info("【TransactionAspect 异常抛出增强】模拟业务异常回滚事务，异常信息为："+e.getMessage());
        log.info("session.rollback();");
    }
    /**
     * 最终增强-执行关闭数据库资源
     */
//    @After(value = "execution(* service..*.*(..))")
    @After(value = "pt()")
    public void after(JoinPoint jp) {
        log.info("【TransactionAspect 最终增强】模拟业务完成释放资源...");
        log.info("MyBatiUtil.closeSqlSession(sqlSession);");
    }
}
